package com.sigmatrix.h5.service;

import java.util.List;
import java.util.Map;

import com.sigmatrix.h5.dto.ProductData;
import com.sigmatrix.h5.dto.QRCodeError;
import com.sigmatrix.h5.entity.MultistageLevelQRCode;
import com.sigmatrix.h5.exception.ServiceException;
import com.sigmatrix.h5.web.vo.InStorageVo;
import com.sigmatrix.h5.web.vo.OutStorageVo;
import com.sigmatrix.sc.mongo.common.service.MongoService;

/**
 * 
 *@ClassName: MultistageLevelQrCodeService
 *@Description: 多级码表
 *@author MH
 *@date 2017年9月22日 上午9:52:05
 */
public interface MultistageLevelQrCodeService extends MongoService<MultistageLevelQRCode> {
	/**
	 * 
	 *@Title: findByQrCode
	 *@Description: 通过qrCode查询
	 *@return MultistageLevelQRCode
	 *@author MH
	 *@date 2017年9月26日 下午4:24:42
	 *@param qrCode
	 *@return
	 */
	MultistageLevelQRCode findByPackContent(String packContent);
	
	/**
	 * 
	 * @param packContent
	 * @param eseCode
	 * @return
	 */
	MultistageLevelQRCode findByPackContent(String packContent,String eseCode);
	
	/**
	 * 
	 *@Title: findBySeqNum
	 *@Description: 通过seqNum查询
	 *@return MultistageLevelQRCode
	 *@author MH
	 *@date 2017年9月26日 下午4:27:29
	 *@param seqNum
	 *@return
	 */
	MultistageLevelQRCode findBySeqNum(String seqNum);
	
	/**
	 * 
	 * @param seqNum
	 * @param eseCode
	 * @return
	 */
	MultistageLevelQRCode findBySeqNum(String seqNum,String eseCode);
	
	/**
	 * 
	 *@Title: findByFriendlyCode
	 *@Description: 通过友好码查询
	 *@return MultistageLevelQRCode
	 *@author MH
	 *@date 2017年9月26日 下午4:28:00
	 *@param friendlyCode
	 *@return
	 */
	MultistageLevelQRCode findByFriendlyCode(String friendlyCode);
	
	/**
	 * 
	 *@Title: findBySeqOrFriendlyCode
	 *@Description: 通过seqNum或者友好码查询
	 *@return MultistageLevelQRCode
	 *@author MH
	 *@date 2017年9月27日 上午10:22:53
	 *@param code
	 *@param codeType
	 *@return
	 */
	MultistageLevelQRCode findBySeqOrFriendlyCode(String code,Short codeType);
	/**
	 * 
	 *@Title: findByParent
	 *@Description: 通过父级经销商查询
	 *@return List<MultistageLevelQRCode>
	 *@author MH
	 *@date 2017年10月26日 下午2:14:01
	 *@param parentCode
	 *@return
	 */
	List<MultistageLevelQRCode> findByParent(String parentCode);
	
	/**
	 * 
	 *@Title: findByParallelCode
	 *@Description:通过同级码查询
	 *@return MultistageLevelQRCode
	 *@author MH
	 *@date 2018年1月16日 下午5:47:06
	 *@param qrCode
	 *@return
	 */
	MultistageLevelQRCode findByParallelCode(String qrCode);
	
	/**
	 *@Title: recursionPackCodeList
	 *@Description: 递归获得虚拟码包含的所有包装码
	 *@return List<String>
	 *@author youjun
	 *@date 2017年8月6日 下午5:00:51
	 *@param enterpriseCode
	 *@param code
	 *@param productPackLevel
	 *@return
	 *@throws ServiceException
	 */
	List<String> recursionPackCodeList(String enterpriseCode, MultistageLevelQRCode code, int productPackLevel)
			throws ServiceException;

	/**
	 *@Title: findMultistageLevelQRCodeByQRCodeAndLevel
	 *@Description: 根据码和码级别查找企业的多级码信息
	 *@return MultistageLevelQRCode
	 *@author youjun
	 *@date 2017年8月7日 下午1:43:55
	 *@param enterpriseCode
	 *@param qRCode
	 *@param qRCodeLevel
	 *@return
	 *@throws ServiceException
	 */
	MultistageLevelQRCode findMultistageLevelQRCodeByQRCodeAndLevel(String enterpriseCode, String qRCode,
			Integer qRCodeLevel, Integer codeType, boolean isNeedConversion) throws ServiceException;

	/**
	 *@Title: findMultistageLevelQRCodeByQRCode
	 *@Description: 根据码查找企业的多级码信息
	 *@return MultistageLevelQRCode
	 *@author youjun
	 *@date 2017年8月7日 下午1:54:08
	 *@param enterpriseCode
	 *@param qRCode
	 *@return
	 *@throws ServiceException
	 */
	MultistageLevelQRCode findMultistageLevelQRCodeByQRCode(final String enterpriseCode, final String qRCode, final Integer codeType, final boolean isNeedConversion) 
			throws ServiceException;

	/**
	 *@Title: getInventedCodeRelatedInfo
	 *@Description: 获得虚拟码(码级别大于包装级别的码)及相关信息,包括:拥有的包装单位的数量、拥有的包装码集合
	 *@return Map<String,Object> map的key如下:有key1才有之后的
	 *	<ul>
	 *		<li>1、<b>multistageLevelQRCode</b>：value为:MultistageLevelQRCode,多级码</li>
	 *		<li>2、<b>packCodeList</b>：value为:List<String>,拥有的包装码的集合</li>
	 *		<li>3、<b>packCodeCount</b>：value为:Integer,key2的size</li>
	 *		<li>4、<b>packMultistageLevelList:</b>如果参数isSelectChildPackLevelCode为true,子码是包装时,查所有子包装码集合</li>
	 *		<li>5、<b>packFirstLevelList:</b>如果参数isSelectChildPackLevelCode为true,子码是单品码时,查所有子单品码集合</li>
	 *	</ul>
	 *@author youjun
	 *@date 2017年8月5日 下午5:26:46
	 *@param enterpriseCode 企业code,必传
	 *@param code 虚拟码,码级别大于包装级别的码,必传
	 *@param codeLevel 虚拟码的级别
	 *@param isNeedConversion 是否需要转换码
	 *@param packLevel 虚拟码对应产品的包装级别,必传
	 *@param isSelectChildPackLevelCode 是否查询所包含的packLevel级别的码
	 *@return
	 */
	Map<String, Object> getInventedCodeRelatedInfo(String enterpriseCode, String code, Integer codeLevel, boolean isNeedConversion, int packLevel, 
			boolean isSelectChildPackLevelCode)	throws ServiceException;

	/**
	 *@Title: updateOutStorageCode
	 *@Description: 根据出库码:1、更新码的状态为出库  2、解除包装关系
	 *@return void
	 *@author youjun
	 *@date 2017年8月14日 上午10:16:47
	 *@param outStorageVo
	 *@param map
	 */
	void updateOutStorageCode(OutStorageVo outStorageVo, Map<String, Object> map) throws ServiceException;

	/**
	 *@Title: updateInStorageCode
	 *@Description: TODO()
	 *@return void
	 *@author youjun
	 *@date 2017年8月22日 下午3:06:30
	 *@param inStorageVo
	 *@param map
	 */
	void updateInStorageCode(InStorageVo inStorageVo, Map<String, Object> map) throws ServiceException;
	
	/**
	 *@Title: validatePackLevelCode
	 *@Description: 判断<b>"包装级别码"</b>是否为null、是否出库、是否满包装,返回错误包装数
	 *@return int
	 *@author youjun
	 *@date 2017年8月12日 上午1:27:50
	 *@param qRCodeErrorList
	 *@param item
	 *@param operateCode 手持<b>直接</b>上传的是包装码就传入,否则传入""
	 *@param product
	 *@param isSelf 是否为多级码本身
	 *@param type 1为出库,2为入库
	 *@return
	 * @throws ServiceException 
	 */
	int validatePackLevelCode(List<QRCodeError> qRCodeErrorList, MultistageLevelQRCode item, String operateCode,
			ProductData product, boolean isSelf, int type, Integer warehouseId, OutStorageVo outStorageVo) throws ServiceException;

	/**
	 *@Title: getSpecifiedUpLevelCode
	 *@Description: 根据当前码获得指定的某一个<b>上级</b>级别的码信息
	 *@return MultistageLevelQRCode
	 *@author youjun
	 *@date 2017年8月17日 上午2:10:20
	 *@param enterpriseCode
	 *@param packContent 码
	 *@param codeLevel 当前码级别,可为null,为null将根据packContent查询到对应码后获得
	 *@param isNeedConversion 是否需要转换码
	 *@param specifiedLevel 指定级别
	 *@return
	 */
	MultistageLevelQRCode getSpecifiedUpLevelCode(String enterpriseCode, String packContent, Integer codeLevel, boolean isNeedConversion,
			int specifiedLevel) throws ServiceException;

	/**
	 *@Title: packGroupSplitBox
	 *@Description: 组箱拆箱操作
	 *@return void
	 *@author youjun
	 *@date 2017年8月18日 下午8:40:45
	 *@param enterpriseCode
	 *@param packCode
	 *@param operateCodeList
	 *@param operationType
	 */
	void packGroupSplitBox(String enterpriseCode, String packCode, List<String> operateCodeList, int operationType) throws ServiceException;

	/**
	 *@Title: packGroupSplitStack
	 *@Description: 拆垛、补垛、组新垛操作
	 *@return void
	 *@author youjun
	 *@date 2017年8月20日 下午5:20:55
	 *@param enterpriseCode 企业code
	 *@param targetCode 目标码,拆垛、组新垛操作时为最大级别码,补垛时为包装单位上级码
	 *@param operateCodeList  操作的包装码
	 *@param operationType 操作方式:3、补垛 4、拆垛 5、新增垛
	 *@param product 当前操作的产品对象
	 */
	void packGroupSplitStack(String enterpriseCode, String targetCode, List<String> operateCodeList, int operationType,
			ProductData product) throws ServiceException;

	/**
	 *@Title: generatedParentCode
	 *@Description: 生成多级码
	 *@return String
	 *@author youjun
	 *@date 2017年8月20日 下午8:20:25
	 *@param enterpriseCode
	 *@param referenceMultisQRCode 参考码,必须为库中的码,取其中的共有信息
	 *@param parentCode 上级码
	 *@param codeLevel 生成的码的级别
	 *@param codeCategoryPrefix 生成码的前缀,传""将使用默认的
	 *@return
	 */
	String generatedMultistageQRCode(String enterpriseCode, MultistageLevelQRCode referenceMultisQRCode,
			String parentCode, int codeLevel, String codeCategoryPrefix) throws ServiceException;

	/**
	 *@Title: findMultistageLevelQRCodeByCondition
	 *@Description: TODO()
	 *@return List<MultistageLevelQRCode>
	 *@author youjun
	 *@date 2017年8月21日 下午1:35:08
	 *@param multistageLevelQRCodeCondition
	 *@return
	 */
	List<MultistageLevelQRCode> findMultistageLevelQRCodeByCondition(
			MultistageLevelQRCode multistageLevelQRCodeCondition) throws ServiceException;

	/**
	 *@Title: updateOne
	 *@Description: 更新一条数据
	 *@return void
	 *@author youjun
	 *@date 2017年8月22日 上午11:28:51
	 *@param multistageLevelQRCode
	 *@throws ServiceException
	 */
	void updateOne(MultistageLevelQRCode multistageLevelQRCode) throws ServiceException;

	/**
	 *@Title: validateCodeIsFullPack
	 *@Description: 验证码是否满包装,满包装将返回null,否则返回QRCodeError对象
	 *@return QRCodeError
	 *@author youjun
	 *@date 2017年8月25日 下午5:06:51
	 *@param item
	 *@param product
	 *@return
	 *@throws ServiceException
	 */
	QRCodeError validateCodeIsFullPack(MultistageLevelQRCode item, ProductData product)
			throws ServiceException;
}
